package it.demo.twitterlike.rest.api.impl;
import it.demo.twitterlike.rest.api.MessageOperations;
import it.demo.twitterlike.rest.api.TwitterLike;
import it.demo.twitterlike.rest.api.UserOperations;
import java.util.Arrays;
import org.springframework.hateoas.MediaTypes;
import org.springframework.hateoas.hal.Jackson2HalModule;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.social.oauth2.AbstractOAuth2ApiBinding;
import org.springframework.social.support.ClientHttpRequestFactorySelector;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
public class TwitterLikeTemplate extends AbstractOAuth2ApiBinding implements
TwitterLike {
private UserOperations userOpertations;
private MessageOperations messageOperations;
private final String baseUrl;
public TwitterLikeTemplate(String baseUrl, String accessToken) {
super(accessToken);
this.baseUrl = baseUrl;
initialize();
}
// private helpers
private void initialize() {
// Wrap the request factory with a BufferingClientHttpRequestFactory so
// that the error handler can do repeat reads on the response.getBody()
super.setRequestFactory(ClientHttpRequestFactorySelector
.bufferRequests(getRestTemplate().getRequestFactory()));
initSubApis();
}
@Override
protected MappingJackson2HttpMessageConverter getJsonMessageConverter() {
return getHalConverter();
}
private static final MappingJackson2HttpMessageConverter getHalConverter() {
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new Jackson2HalModule());
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES,
false);
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
converter.setObjectMapper(mapper);
converter.setSupportedMediaTypes(Arrays.asList(MediaTypes.HAL_JSON));
return converter;
}
private void initSubApis() {
userOpertations = new UserTemplate(baseUrl, getRestTemplate());
messageOperations = new MessageTemplate(baseUrl, getRestTemplate());
}
@Override
public UserOperations userOperations() {
return userOpertations;
}
@Override
public MessageOperations messageOperations() {
return messageOperations;
}
}